"""
@Author  : 康帅
@Time    : 2021/3/15 14:20
@Function: 单例模式案列(使用单例装饰器)
"""


# 创建外层函数singleton，可以传入类
def singleton_decorator(cls, *args, **kwargs):
    """ 定义一个单例装饰器 """

    # 创建一个instance字典用来保存单例
    instance = {}

    # 创建一个内层函数来获得单例
    def wrapper(*args, **kwargs):
        # 判断instance字典中是否含有单例，如果没有就创建单例并保存到instance字典中，然后返回该单例
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    # 返回内层函数wrapper
    return wrapper


# @singleton_decorator相当于MyBeautifulGirl = singleton（MyBeautifulGirl）
# 在创建实例对象时会先将MyBeautifulGirl作为参数传入到singleton函数中，
# 函数在执行过程中不会执行wrapper函数（函数只有调用才会执行），直接返回wrapper函数名
@singleton_decorator
class MyBeautifulGirl:

    def __init__(self, name):
        self.__name = name

        if self.__name == name:
            print("遇见" + name + ",一见钟情")
        else:
            print("遇见" + name + ",我置若盲闻")

    def show_my_heart(self):
        print(self.__name + "是我心中的唯一")


if __name__ == '__main__':
    jenny = MyBeautifulGirl("Jenny")
    jenny.show_my_heart()
    kimi = MyBeautifulGirl("Kimi")
    kimi.show_my_heart()
    print("id(jenny):", id(jenny), "id(kimi):", id(kimi))
